//原型
// 原型链的终点 =》》 Object.prototype

// prototype是定义构造函数构造出的每个对象的公共祖先
// 每个被该构造函数构造出来的对象都可以继承原型上的属性和方法
// 实例化出来的对象无法 '增' '删' '改' 构造函数的prototype 
// 
// function HandlePhone(color, brand) {
//   this.color = color;
//   this.brand = brand;
//   this.screen = '18:9';
//   this.system = 'Android';
// }
// HandlePhone.prototype.rom = '64GB';
// HandlePhone.prototype.screen = '20:4';
// let phone1 = new HandlePhone('black', 'huawei');
// console.log(phone1.__proto__);   
// console.log(HandlePhone.prototype);   
// console.log(HandlePhone.prototype === phone1.__proto__); 
// console.log(HandlePhone === HandlePhone.prototype.constructor);

/***
 * 面试题
 */
// Car.prototype.name = 'bmw'
// function Car() {}
// Car.prototype = {
//   name: 'mazada'
// }
// let car = new Car()
// // Car.prototype.name = 'mazada'
// console.log(car.name);

// Professor.prototype.tSkill = 'JAVA';
// function Professor() {};
// let professor = new Professor();

// Teacher.prototype = professor;
// function Teacher() {
//   this.mSkill = 'JS/JQ';
//   this.success = {
//     alibaba: '24',
//     baidu: '25',
//   };
//   this.age = 45;
// };
// let teacher = new Teacher();

// Student.prototype = teacher;
// function Student() {
//   this.pSkill = 'HTML/CSS';
// }
// let student = new Student();
// student.age = 20;
// student.success.tencent = '26';
// console.log(student, 'student--------');
// console.log(teacher, 'teacher--------');

/**
 * 面试题
 */

// function Car() {
//   this.brand = 'benz';
// }
// Car.prototype = {
//   brand: 'mazada',
//   intro() { 
//     console.log(`我是${this.brand}车`);
//   }
// };
// let car = new Car();
// car.intro();
// Car.prototype.intro();

// const prototypeObj = {
//   name: 'yz'
// }
// const engineer = Object.create(prototypeObj, {
//   age: {
//     value: 26,
//     writable: true,
//     configurable: true,
//     enumerable: false,
//   },
//   sex: {
//     value: 'male',
//     writable: false,
//     configurable: false,
//     enumerable: true,
//   }
// })
// console.log(engineer.name);
// console.log(engineer.age);
// console.log(engineer.sex);
// console.log(Object.keys(engineer));
// console.log(Object.keys(prototypeObj));
// console.log(Object.prototype.toString.call(Object.create(null))); 


/**
 * 使用中间件解决原型的继承和隔离，圣杯模式
 */
// function Teacher() {
//   this.name = 'Mr Wang'
// }
// Teacher.prototype = {
//   skill: 'JAVA'
// }
// function Student() {
//   this.name = 'liming'
// }
// // 继承
// function inherit(target, origin) {
//   function Buffer() {}
//   Buffer.prototype = origin.prototype;
//   let buffer = new Buffer();
//   target.prototype = buffer;
//   target.prototype.constructor = target;
//   target.prototype.super_class = origin;
//   return target
// }
// // console.log(inherit(Student, Teacher));
// let _Student = inherit(Student, Teacher)
// _Student.prototype.age = 23;
// let student = new _Student();
// console.log(student.__proto__);
// console.log(student.skill);
// console.log(student.age);

// let teacher = new Teacher();
// console.log(teacher.age);

function canCross(stones) {
  const n = stones.length;
  const dp = new Array(n).fill(0).map(() => new Array(n).fill(false));
  dp[0][0] = true;
  for (let i = 1; i < n; i++) {
      for (let k = 0; k < i; k++) {
          const jumpDistance = stones[i] - stones[k];
          if (jumpDistance <= k + 1) {
              dp[i][jumpDistance] = dp[k][jumpDistance - 1] || dp[k][jumpDistance] || dp[k][jumpDistance + 1];
          }
      }
  }
  return dp[n - 1].some((val) => val);
}

const stones = [0,1,2,3,4,8,9,11];
const result = canCross(stones);
console.log(result);

console.log(new Array(10).fill(0).map(() => new Array(10).fill(false)));
